package br.org.acessobrasil.portal.modelo;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Transient;

@Entity
@Table(name = "sgctb_pagina")
public class Pagina implements Serializable,Cloneable {
	
	private static final long serialVersionUID = 7826564228732503667L;
	@Id
	@GeneratedValue
	private Long nu_pagina;
	private Long nu_sitio;
	
	/**
	 * Utilizado para definir links de forma arbitraria<br>
	 * solicitacao feita pela Mariana e Ana do Centro Cultural da Saude<br>
	 * uri eg.: pasta/subpasta/nome.html
	 */
	@Column(length=255)
	private String uri;

	/**
	 * Guarda a data de qualquer alteracao feita em um de seus conteudos
	 */
	private Date dataControleDeCache;
	
	/**
	 * TODO melhor ter um pai, que pode ser pagina ou item de menu
	 */
	private Long nu_item_menu_secao;
	private Long nu_padrao_apresentacao;
	private String no_titulo;
	@Column(length=1000)
	private String de_pagina;
	@ManyToOne
	@JoinColumn(name = "nu_item_menu_secao", updatable = false, insertable = false)
	private ItemMenu itemMenuSecao;
	
	@OneToMany(cascade = CascadeType.REMOVE, fetch = FetchType.LAZY)
	@JoinColumn(name = "nu_pagina")
	private List<Conteudo> listConteudo;

	@ManyToOne
	@JoinColumn(name = "nu_sitio", updatable = false, insertable = false)
	private Sitio sitio;

	@ManyToOne
	@JoinColumn(name = "nu_padrao_apresentacao", updatable = false, insertable = false)
	private PadraoApresentacao padraoApresentacao;

	private Boolean temVinculoPro = false;
	
	private String urlPro;
	
	/**
	 * @see Pagina#getUrlArquivo() 
	 */
	@Transient
	private String urlArquivo;
	
	/**
	 * Utilizado quando geramos uma pagina de arquivo de itens de conteudo,
	 * como se fosse um blog.
	 * Caso tenha urlArquivo diferente de null o Gerenciador
	 * na hora de gerar o breadCrumb coloca este link em vez do link padrao
	 * Eg.: index.action?nu_pagina=33
	 * 
	 */
	public String getUrlArquivo() {
		return urlArquivo;
	}
	
	/**
	 * 
	 * @param urlArquivo
	 * @see Pagina#getUrlArquivo() 
	 */
	public void setUrlArquivo(String urlArquivo) {
		this.urlArquivo = urlArquivo;
	}
	
	public Long getNuPagina() {
		return nu_pagina;
	}

	public void setNuPagina(Long nu_pagina) {
		this.nu_pagina = nu_pagina;
	}

	public Long getNuSitio() {
		return nu_sitio;
	}

	public void setNuSitio(Long nu_sitio) {
		this.nu_sitio = nu_sitio;
	}

	public Long getNuItemMenuSecao() {
		return nu_item_menu_secao;
	}

	public void setNuItemMenuSecao(Long nu_item_menu_secao) {
		this.nu_item_menu_secao = nu_item_menu_secao;
	}

	public String getNoTitulo() {
		return no_titulo;
	}

	public void setNoTitulo(String no_titulo) {
		this.no_titulo = no_titulo;
	}

	public String getDePagina() {
		return de_pagina;
	}

	public void setDePagina(String de_descricao) {
		this.de_pagina = de_descricao;
	}

	public List<Conteudo> getListConteudo() {
		return listConteudo;
	}

	public void setListConteudo(List<Conteudo> listConteudo) {
		this.listConteudo = listConteudo;
	}

	public Sitio getSitio() {
		return sitio;
	}

	public void setSitio(Sitio sitio) {
		this.sitio = sitio;
	}

	public void setPadraoApresentacao(PadraoApresentacao padraoApresentacao) {
		this.padraoApresentacao = padraoApresentacao;
	}

	public PadraoApresentacao getPadraoApresentacao() {
		return padraoApresentacao;
	}

	public ItemMenu getItemMenuSecao() {
		return itemMenuSecao;
	}

	public void setItemMenuSecao(ItemMenu itemMenuSecao) {
		this.itemMenuSecao = itemMenuSecao;
	}

	public Long getNuPadraoApresentacao() {
		return nu_padrao_apresentacao;
	}

	public void setNuPadraoApresentacao(Long nu_padrao_apresentacao) {
		this.nu_padrao_apresentacao = nu_padrao_apresentacao;
	}
	public String toString(){
		return "Pagina\n\tTitulo=" + this.no_titulo 
			+"\n\tid="+this.nu_pagina
			+"\n\tnu_padrao_apresentacao="+this.nu_padrao_apresentacao
			;
	}
	
	@Override
	public Object clone() throws CloneNotSupportedException {
		return super.clone();
	}
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result
				+ ((de_pagina == null) ? 0 : de_pagina.hashCode());
		result = prime * result
				+ ((itemMenuSecao == null) ? 0 : itemMenuSecao.hashCode());
		result = prime * result
				+ ((listConteudo == null) ? 0 : listConteudo.hashCode());
		result = prime * result
				+ ((no_titulo == null) ? 0 : no_titulo.hashCode());
		result = prime
				* result
				+ ((nu_item_menu_secao == null) ? 0 : nu_item_menu_secao
						.hashCode());
		result = prime
				* result
				+ ((nu_padrao_apresentacao == null) ? 0
						: nu_padrao_apresentacao.hashCode());
		result = prime * result
				+ ((nu_pagina == null) ? 0 : nu_pagina.hashCode());
		result = prime * result
				+ ((nu_sitio == null) ? 0 : nu_sitio.hashCode());
		result = prime
				* result
				+ ((padraoApresentacao == null) ? 0 : padraoApresentacao
						.hashCode());
		result = prime * result + ((sitio == null) ? 0 : sitio.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (!(obj instanceof Pagina))
			return false;
		Pagina other = (Pagina) obj;
		if (de_pagina == null) {
			if (other.de_pagina != null)
				return false;
		} else if (!de_pagina.equals(other.de_pagina))
			return false;
		if (itemMenuSecao == null) {
			if (other.itemMenuSecao != null)
				return false;
		} else if (!itemMenuSecao.equals(other.itemMenuSecao))
			return false;
		if (listConteudo == null) {
			if (other.listConteudo != null)
				return false;
		} else if (!listConteudo.equals(other.listConteudo))
			return false;
		if (no_titulo == null) {
			if (other.no_titulo != null)
				return false;
		} else if (!no_titulo.equals(other.no_titulo))
			return false;
		if (nu_item_menu_secao == null) {
			if (other.nu_item_menu_secao != null)
				return false;
		} else if (!nu_item_menu_secao.equals(other.nu_item_menu_secao))
			return false;
		if (nu_padrao_apresentacao == null) {
			if (other.nu_padrao_apresentacao != null)
				return false;
		} else if (!nu_padrao_apresentacao.equals(other.nu_padrao_apresentacao))
			return false;
		if (nu_pagina == null) {
			if (other.nu_pagina != null)
				return false;
		} else if (!nu_pagina.equals(other.nu_pagina))
			return false;
		if (nu_sitio == null) {
			if (other.nu_sitio != null)
				return false;
		} else if (!nu_sitio.equals(other.nu_sitio))
			return false;
		if (padraoApresentacao == null) {
			if (other.padraoApresentacao != null)
				return false;
		} else if (!padraoApresentacao.equals(other.padraoApresentacao))
			return false;
		if (sitio == null) {
			if (other.sitio != null)
				return false;
		} else if (!sitio.equals(other.sitio))
			return false;
		return true;
	}

	public boolean isTemVinculoPro() {
		if(temVinculoPro==null){
			temVinculoPro = false;
		}
		return temVinculoPro;
	}

	public void setTemVinculoPro(boolean temVinculoPro) {
		this.temVinculoPro = temVinculoPro;
	}

	public String getUrlPro() {
		return urlPro;
	}

	public void setUrlPro(String urlPro) {
		this.urlPro = urlPro;
	}
	
	/**
	 * Para ser utilizado na pagina_list.jsp
	 * @return listConteudo.size();
	 */
	public int getConteudoTotal(){
		return listConteudo.size();
	}
	
	public Date getDataControleDeCache() {
		return dataControleDeCache;
	}
	
	public void setDataControleDeCache(Date dataControleDeCache) {
		this.dataControleDeCache = dataControleDeCache;
	}
	
	/**
	 * Utilizado para definir links de forma arbitraria
	 * @return uri eg.: pasta/subpasta/nome.html
	 */
	public String getUri() {
		return uri;
	}
	
	/**
	 * Utilizado para definir links de forma arbitraria
	 * @param uri eg.: pasta/subpasta/nome.html
	 */
	public void setUri(String uri) {
		this.uri = uri;
	}
}